package models

import "time"

type DiskInfo struct {
	Name       string `json:"name"`
	MountPoint string `json:"mount_point"`
	TotalSpace int64  `json:"total_space"`      // bytes
	UsedSpace  int64  `json:"used_space"`       // bytes
	FreeSpace  int64  `json:"free_space"`       // bytes
	UsedPercent float64 `json:"used_percent"`
	FileSystem string `json:"file_system"`
}

type SystemInfo struct {
	CPUInfo      string   `json:"cpu_info"`
	CPUCores     int      `json:"cpu_cores"`
	MemoryTotal  int64    `json:"memory_total"`   // bytes
	MemoryUsed   int64    `json:"memory_used"`    // bytes
	MemoryFree   int64    `json:"memory_free"`    // bytes
	MemoryPercent float64 `json:"memory_percent"`
	OS           string   `json:"os"`
	Kernel       string   `json:"kernel"`
	Arch         string   `json:"arch"`
	Uptime       int64    `json:"uptime"`         // seconds
	LoadAvg      []float64 `json:"load_avg"`      // 1min, 5min, 15min
}

type Worker struct {
	ID            string        `json:"id"`
	Name          string        `json:"name"`
	IPAddress     string        `json:"ip_address"`
	Status        string        `json:"status"`  // "online" or "offline"
	HeartbeatStatus string      `json:"heartbeat_status"`  // "healthy", "warning", "error"
	LastHeartbeat time.Time     `json:"last_heartbeat"`
	CreatedAt     time.Time     `json:"created_at"`
	ConsecutiveHeartbeatFailures int `json:"consecutive_heartbeat_failures"`
	ConsecutiveHeartbeatSuccess int `json:"consecutive_heartbeat_success"`
	SystemInfo    *SystemInfo   `json:"system_info,omitempty"`
	DiskInfo      []DiskInfo    `json:"disk_info,omitempty"`
	FIOVersion    string        `json:"fio_version,omitempty"`
	FIOStatus     string        `json:"fio_status"`
}

type TestCase struct {
	ID          string      `json:"id"`
	Name        string      `json:"name"`
	Description string      `json:"description"`
	FIOConfig   interface{} `json:"fio_config"`
	CreatedAt   time.Time   `json:"created_at"`
}

type Task struct {
	ID         string      `json:"id"`
	Name       string      `json:"name"`
	TestCaseID string      `json:"test_case_id"`
	WorkerID   string      `json:"worker_id"`
	// 支持多个 Worker 的场景（并行执行同一个任务）
	WorkerIDs  []string    `json:"worker_ids,omitempty"`
	Status     string      `json:"status"`
	StartTime  *time.Time  `json:"start_time,omitempty"`
	EndTime    *time.Time  `json:"end_time,omitempty"`
	Result     interface{} `json:"result,omitempty"`
	CreatedAt  time.Time   `json:"created_at"`
	// 任务特定配置，用于覆盖测试用例中的默认配置
	TaskConfigOverride interface{} `json:"task_config_override,omitempty"`
}

type WorkerRegistration struct {
	Name       string `json:"name"`
	IPAddress  string `json:"ip_address"`
	FIOVersion string `json:"fio_version,omitempty"`
}

type TaskAssignment struct {
	Name       string           `json:"name"`
	TestCaseID string           `json:"test_case_id"`
	WorkerIDs  []string         `json:"worker_ids,omitempty"`  // 旧格式支持
	Workers    []WorkerTaskConfig `json:"workers,omitempty"`    // 新格式支持
}

// WorkerTaskConfig 包含Worker特定的任务配置
type WorkerTaskConfig struct {
	WorkerID         string      `json:"worker_id"`
	TaskConfigOverride interface{} `json:"task_config_override,omitempty"` // 配置覆盖
}